#define MATRIXA 1
#define MATRIXB 2
#define MATRIXC 3
#define MATRIXBTRANSPOSE 4


class WindowsThreading
{
	
	int* matrix_A;
	int* matrix_B;
	int* matrix_C;
	
	int* matrix_B_transpose;
	int number_of_threads;
	int rows_matrix_A;
	int colums_matrix_A;
	int rows_matrix_B;
	int colums_matrix_B;
public:
	int ** matrix_C_array;
	int AssignMemoryToArray(int );
	friend void ThreadFunction(void*);	//global function declared friend in class to access private data
	friend void ThreadFunctionForResources(void* );
	/** Matrix Multiplication related function **/
	int AssignMemory(int);
	int DeleteMemory(int);
	int MatrixGeneration(int);
	int MatrixStore(int);
	int MatrixTranspose();

	void* MemoryCopy (void*, const void*, int);
	
	/** Setter functions **/
	void SetMatrixA(int* mat)	{ matrix_A = mat; }
	void SetMatrixB(int* mat)	{ matrix_B = mat; }
	void SetMatrixC(int* mat)	{ matrix_C = mat; }
	void SetNumberOfThreads(int th){ number_of_threads = th; }
	void SetRowsMatrixA(int row){ rows_matrix_A = row; }
	void SetRowsMatrixB(int row){ rows_matrix_B = row; }
	void SetColumsMatrixA(int col){ colums_matrix_A = col; }
	void SetColumsMatrixB(int col){ colums_matrix_B = col; }

	/**  getter function **/
	int* GetMatrixA()	{ return matrix_A;}
	int* GetMatrixB()	{ return matrix_B;}
	int* GetMatrixC()	{ return matrix_C;}
	//int ** GetMatrixCArray() {return matrix_C_array;}
	int GetNumberOfThreads(){ return number_of_threads; }
	int GetRowsMatrixA(){ return rows_matrix_A; }
	int GetRowsMatrixB(){ return rows_matrix_B; }
	int GetColumsMatrixA(){ return colums_matrix_A; }
	int GetColumsMatrixB(){ return colums_matrix_B; }
};

/** Data Structure for Thread Function **/
struct DataForThreadFunc
{
	int thread_number;
	WindowsThreading * current_object;
};